]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
inputMethod: Use forward_key() method to forward key events
authorCarlos Garnacho <carlosg@gnome.org>
Thu, 27 Sep 2018 19:09:02 +0000 (21:09 +0200)
committerCarlos Garnacho <mrgarnacho@gmail.com>
Mon, 8 Oct 2018 16:35:53 +0000 (16:35 +0000)
ClutterVirtualInputDevice has the limitation that event flags won't be
made to contain CLUTTER_EVENT_FLAG_INPUT_METHOD, possibly causing feedback
loops.

As the event gets injected up the platform dependent bits, we can avoid
care on not pressing the same key twice, we still expect coherence between
key presses and releases from the IM though.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/531

js/misc/inputMethod.js

index 7fb78178ae7453b2f58b7258a6620872926867ec..4a92dc49bf5dfe4962141e6c24ce1cd744daf0f0 100644 (file)
@@ -15,8 +15,6 @@ var InputMethod = new Lang.Class({
         this._purpose = 0;
         this._enabled = true;
         this._currentFocus = null;
-        this._currentEvent = null;
-        this._doForwardEvent = false;
         this._preeditStr = '';
         this._preeditPos = 0;
         this._ibus = IBus.Bus.new_async();
@@ -29,9 +27,6 @@ var InputMethod = new Lang.Class({
                                                                  this._onSourceChanged.bind(this));
         this._currentSource = this._inputSourceManager.currentSource;
 
-        let deviceManager = Clutter.DeviceManager.get_default();
-        this._virtualDevice = deviceManager.create_virtual_device(Clutter.InputDeviceType.KEYBOARD_DEVICE);
-
         if (this._ibus.is_connected())
             this._onConnected();
     },
@@ -121,20 +116,16 @@ var InputMethod = new Lang.Class({
 
     _onForwardKeyEvent(context, keyval, keycode, state) {
         let press = (state & IBus.ModifierType.RELEASE_MASK) == 0;
+        state &= ~(IBus.ModifierType.RELEASE_MASK);
 
-        if (this._currentEvent) {
-            // If we are handling this same event in filter_key_press(),
-            // just let it go through, sending the same event again will
-            // be silenced away because the key counts as pressed.
-            if (this._currentEvent.get_key_symbol() == keyval &&
-                (this._currentEvent.type() == Clutter.EventType.KEY_PRESS) == press) {
-                this._doForwardEvent = true;
-                return;
-            }
-        }
+        let curEvent = Clutter.get_current_event();
+        let time;
+        if (curEvent)
+            time = curEvent.get_time();
+        else
+            time = global.display.get_current_time_roundtrip();
 
-        this._virtualDevice.notify_key(Clutter.get_current_event_time(), keycode,
-                                       press ? Clutter.KeyState.PRESSED : Clutter.KeyState.RELEASED);
+        this.forward_key(keyval, keycode + 8, state & Clutter.ModifierType.MODIFIER_MASK, time, press);
     },
 
     vfunc_focus_in(focus) {
@@ -242,22 +233,13 @@ var InputMethod = new Lang.Class({
         if (event.type() == Clutter.EventType.KEY_RELEASE)
             state |= IBus.ModifierType.RELEASE_MASK;
 
-        this._currentEvent = event;
-        this._doForwardEvent = false;
-
         this._context.process_key_event_async(event.get_key_symbol(),
                                               event.get_key_code() - 8, // Convert XKB keycodes to evcodes
                                               state, -1, null,
                                               (context, res) => {
                                                   try {
                                                       let retval = context.process_key_event_async_finish(res);
-
-                                                      if (this._doForwardEvent)
-                                                          retval = false;
-
                                                       this.notify_key_event(event, retval);
-                                                      this._doForwardEvent = false;
-                                                      this._currentEvent = null;
                                                   } catch (e) {
                                                       log('Error processing key on IM: ' + e.message);
                                                   }